package org.pray.activity.itrator;

import java.util.Iterator;

public class ArrayCollection<T> implements Iterable<T> { // 首先设计一个简单的数组集合，一会我们就迭代此集合内的元素

    private final T[] array; // 底层使用一个数组来存放数据

    private ArrayCollection(T[] array) { // private掉，自己用
        this.array = array;
    }

    public static <T> ArrayCollection<T> of(T[] array) { // 开个静态方法直接吧数组转换成ArrayCollection，
        // 其实和直接new一样，但是这样写好看一点
        return new ArrayCollection<>(array);
    }

    public class ArrayIterator implements Iterator<T> { // 这里实现一个，注意别用静态，需要使用对象中存放的数组
        private int cur = 0; // 这里我们通过一个指针表示当前的迭代位置

        @Override
        public boolean hasNext() { // 判断是否还有下一个元素
            return cur < array.length; // 如果指针大于或等于数组最大长度，就不能再继续了
        }

        @Override
        public T next() { // 返回当前指针位置的元素并向后移动一位
            return array[cur++]; // 正常返回对应位置的元素，并将指针自增
        }
    }

    // 实现迭代方法
    @Override
    public Iterator iterator() {
        return new ArrayIterator();
    }

    public static void main(String[] args) {
        String[] arr = new String[] { "AAA", "BBB", "CCC", "DDD" };
        ArrayCollection<String> collection = ArrayCollection.of(arr);
        for (String s : collection) { // 可以直接使用foreach语法糖，当然最后还是会变成迭代器调用
            System.out.println(s);
        }
    }
}